package com.mybatis.mapper;

import com.mybatis.entity.SysRole;
import com.mybatis.entity.SysRoleExtend;
import com.mybatis.entity.SysUser;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;
import java.util.Objects;

public interface UserMapper {
/**
 * 通过id查询用户
 *
 * @param id
 * @return
 */
  SysUser selectById(Long id);

    /**
     * 查询所有的用户
     *
     * @return
     */
    List<SysUser> selectAll();


  /**
   *
   * 根据用户id 获取角色信息
   * @param userId
   * @return
   */
  List<SysRole> selectRolesByUserId(Long userId);

  /**
   *
   * 根据用户id 获取角色信息 和用户名信息
   * @param userId
   * @return
   */
  List<SysRoleExtend> selectRolesWithUserNameByUserId(Long userId);

  /**
   * 新增用户
   * @param sysUser
   * @return
   */
  int insert(SysUser sysUser);


  /**
   * 新增用户
   * @param sysUser
   * @return
   */
  int insert2(SysUser sysUser);

  /**
   * selectKey
   * @param sysUser
   * @return
   */
  int insert3(SysUser sysUser);

  /**
   *
   * 根据主键进行更新
   * @param sysUser
   * @return
   */
  int updateById(SysUser sysUser);


  /**
   * 根据主键进行删除
   * @param id
   * return
   */
  int deleteById(Long id);


  /**
   * 根据用户id和角色的enabled状态获取用户信息
   * @param userId
   * @param enabled
   * @return
   */
  List<SysRole> selectRolesByUserIdAndRoleEnabled(
          @Param("userId") Long userId,
          @Param("enabled") Integer enabled);

  /**
   * 根据用户id和角色的enabled状态获取用户的角色
   * @param user
   * @param role
   * @return
   */
  List<SysRole> selectRolesByUserAndRole(
          @Param("user") SysUser user,
          @Param("role") SysRole role);


  /**
   * 根据动态条件查询用户信息
   * @param sysUser
   * @return
   */
  List<SysUser> selectByUser(SysUser sysUser);

  /**
   * selectKey
   * @param sysUser
   * @return
   * 插入一行数据，如果某一行的参数值不为空，就是用传入的值，如果是空的话，就使用数据库的默认的值
   * alter table sys_user modify column user_email varchar(50) null default 'test@mybatis.tk' comment '邮箱' after user_password;
   */
  int insert4(SysUser sysUser);

  /**
   * 根据用户id或者是用户名查询
   * @param sysUser
   * @return
   */
  SysUser selectByIdOrUserName(SysUser sysUser);

  /**
   * 根据动态条件查询用户信息
   * @param sysUser
   * @return
   */
  List<SysUser> selectByUser4(SysUser sysUser);


  /**
   * 根据用户id集合查询
   * @param idList
   * @return
   */
  List<SysUser> selectByIdList(List<Long> idList);

  /**
   * @param userList
   * @return
   */
  int insertList(List<SysUser> userList);

  /**
   * 通过map更新列
   * @param map
   * @return
   */
  int updateByMap(Map<String , Object> map);


  /**
   * 根据动态条件查询用户信息
   * @param sysUser
   * @return
   */
  List<SysUser> selectByUserBind(SysUser sysUser);
}
